//
// Created by shiminli on 2023/12/30.
//

#include "SQLHelper.h"
#include <mysql/mysql.h>

using namespace std;
namespace ddoffice {

    SQLHelper* SQLHelper::instance = nullptr;
    std::mutex SQLHelper::mtx;

    MYSQL_RES *SQLHelper::executeQuery(const char *query) {
        std::cout << query << std::endl;
        if (mysql_query(conn, query)) {
            fprintf(stderr, "%s\n", mysql_error(conn));
            return nullptr; // 返回 nullptr 值
        }
        MYSQL_RES *res = mysql_store_result(conn);
        return res;
    }

// 增 删 改
    int SQLHelper::executeUpdate(const char* query) {
        std::cout << query << std::endl;
        return mysql_query(conn, query);
    }

    SQLHelper *SQLHelper::getInstance() {
        if (instance == nullptr) {
            std::lock_guard<std::mutex> lock(mtx); // 加锁
            if (instance == nullptr) {
                instance = new SQLHelper();
            }
        }
        return instance;
    }

    std::string SQLHelper::getMysqlError() {
        return mysql_error(conn);
    }
    std::string SQLHelper::getMysqlInfo() {
        return mysql_info(conn);
    }
    long SQLHelper::getLastInsertId() {
        return mysql_insert_id(conn);
    }

    SQLHelper::SQLHelper() {
        conn = mysql_init(NULL);
        if (conn == NULL) {
            fprintf(stderr, "SQLHelper init error1: %s\n", mysql_error(conn));
            exit(1);
        }
        if (mysql_real_connect(conn, MYSQL_HOST, MYSQL_USER, MYSQL_PASSWD,
                               MYSQL_DBNAME, MYSQL_PORT, NULL, 0) == NULL) {
            fprintf(stderr, "SQLHelper init error2: %s\n", mysql_error(conn));
            mysql_close(conn);
            exit(1);
        }
        std::cout<< "Mysql connect success"<<std::endl;
    }

    SQLHelper::~SQLHelper() {
        mysql_close(conn);
        cout << "析构SQLHelper：： conn="<< conn << endl;
    }

}
